#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"


/**
 *https://www.nowcoder.com/practice/6eec992558164276a51d86d71678b300
 * 给定一个整数，请你输出这个整数的中文读法。
例如：
153，读作一百五十三
103，读作一百零三
1003，读作一千零三

数据范围： |val| \le 10^9 \∣val∣≤10
9

示例1
输入：
114514
复制
返回值：
"十一万四千五百一十四"
 * */
using namespace std;
const char *chnUnitSection[] = {"万", "亿", "万亿"};
const char *chnUnitChar[] = {"十", "百", "千"};
const char *chnNumChar[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};

void SectionToChinese(unsigned int section, std::string &chnStr) {
    std::string strIns;
    int unitPos = 0;
    bool zero = true;
    while (section > 0) {
        int v = section % 10;
        if (v == 0) {
            if ((section == 0) || zero) {
                zero = true; /*需要补，zero的作用是确保对连续的多个，只补一个中文零*/
                chnStr.insert(0, chnNumChar[v]);
            }
        } else {
            zero = false; //至少有一个数字不是
            strIns = chnNumChar[v]; //此位对应的中文数字
            strIns += chnUnitChar[unitPos]; //此位对应的中文权位
            chnStr.insert(0, strIns);
        }
        unitPos++; //移位
        section = section / 10;
    }
}

void NumberToChinese(unsigned int num, std::string &chnStr) {
    int unitPos = 0;
    std::string strIns;
    bool needZero = false;
    while (num > 0) {
        unsigned int section = num % 10000;
        if (needZero) {
            chnStr.insert(0, chnNumChar[0]);
        }
        SectionToChinese(section, strIns);
        /*是否需要节权位？ */
        strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
        chnStr.insert(0, strIns);
        /*千位是0需要在下一个section补零*/
        needZero = (section < 1000) && (section > 0);
        num = num / 10000;
        unitPos++;
    }
    std::cout << chnStr;
}